日本語

Google Cloud Functionsでサーバーレスコンピューティングの力を解き放ちましょう。HTTPトリガーを解説し、スケーラブルなイベント駆動型アプリケーションを構築するための知識を世界中の開発者に提供します。

Google Cloud Functions:HTTPトリガーの包括的なガイド

Google Cloud Functions(GCF)は、クラウドサービスを構築し、接続できるサーバーレス実行環境です。Cloud Functionsを使用すると、クラウドインフラストラクチャとサービスから発生したイベントに付加された、シンプルで単一目的の関数を作成できます。監視しているイベントが発生すると、関数が実行されます。このアプローチにより、サーバーやランタイムを管理することなく、イベント駆動型アプリケーションを開発できます。

Cloud Functionをトリガーする最も一般的な方法の1つは、HTTPリクエストを介することです。このガイドでは、Google Cloud FunctionsのHTTPトリガーの世界を掘り下げ、強力でスケーラブルで費用対効果の高いアプリケーションを構築するための知識を提供します。

HTTPトリガーとは

HTTPトリガーを使用すると、HTTPリクエストに応じてCloud Functionを実行できます。基本的に、HTTPリクエストが特定のURLに送信されると、Google Cloud Functionsは関連付けられた関数を自動的に実行します。これにより、HTTPトリガーは、API、Webhook、およびイベント駆動型のWebアプリケーションの構築に最適です。

HTTPトリガーを使用する主な利点:

HTTPトリガーを使用したCloud Functionの作成

HTTPトリガーを使用したシンプルなCloud Functionの作成プロセスを説明します。「Hello, World!」メッセージで応答する関数を作成します。この例は、出力文字列を変更するだけで、さまざまなグローバルロケールに適応できます。

前提条件:

手順:

  1. 新しいプロジェクトの作成(まだない場合):

    GCPプロジェクトがまだない場合は、Google Cloudコンソールで作成してください。

  2. Cloud Functions APIを有効にする:

    Cloudコンソールで、Cloud Functions APIに移動し、有効にします。

  3. 関数ディレクトリの作成:

    Cloud Functionの新しいディレクトリを作成します。たとえば、次のようになります。

    mkdir hello-http
    cd hello-http
  4. 関数コードの記述:

    次のコードを含む`main.py`(またはNode.jsの場合は`index.js`)という名前のファイルを作成します。

    Python (main.py):

    def hello_http(request):
        """HTTP Cloud Function.
        Args:
            request (flask.Request): The request object.
            
        Returns:
            The response text, or any set of values that can be turned into a
            Response object using `make_response`
            .
        """
        request_json = request.get_json(silent=True)
        request_args = request.args
    
        if request_json and 'name' in request_json:
            name = request_json['name']
        elif request_args and 'name' in request_args:
            name = request_args['name']
        else:
            name = 'World'
        return f'Hello, {name}!'

    Node.js (index.js):

    exports.helloHttp = (req, res) => {
      let name = 'World';
      if (req.body.name) {
        name = req.body.name;
      } else if (req.query.name) {
        name = req.query.name;
      }
      res.status(200).send(`Hello, ${name}!`);
    };
    
  5. 要件ファイルの作成(Pythonのみ):

    Pythonを使用している場合は、`requirements.txt`という名前のファイルを作成し、関数に必要な依存関係を追加します。この例では、厳密には必要ありませんが、含めることをお勧めします。依存関係がない場合は、空のままにしておくことができます。

  6. 関数のデプロイ:

    `gcloud functions deploy`コマンドを使用して、関数をデプロイします。`YOUR_FUNCTION_NAME`を関数の希望する名前に置き換えます。

    Python:

    gcloud functions deploy YOUR_FUNCTION_NAME \
        --runtime python39 \
        --trigger-http \
        --allow-unauthenticated

    Node.js:

    gcloud functions deploy YOUR_FUNCTION_NAME \
        --runtime nodejs16 \
        --trigger-http \
        --allow-unauthenticated

    パラメータの説明:

    • `YOUR_FUNCTION_NAME`: Cloud Functionに付けたい名前。
    • `--runtime`: 関数のランタイム環境(例:`python39`、`nodejs16`)。
    • `--trigger-http`: 関数をHTTPリクエストでトリガーすることを指定します。
    • `--allow-unauthenticated`: 認証なしで誰でも関数を呼び出すことを許可します。 警告:本番環境でこれを有効にする場合は注意してください! 適切な認証と認可を実装することを検討してください。
  7. 関数のテスト:

    デプロイ後、`gcloud`コマンドは関数のURLを出力します。次に、`curl`やPostmanなどのツールを使用して、そのURLにHTTPリクエストを送信することでテストできます。

    curl YOUR_FUNCTION_URL

    レスポンスに「Hello, World!」メッセージが表示されるはずです。また、クエリパラメータとして名前を渡すこともできます。

    curl "YOUR_FUNCTION_URL?name=YourName"

    これにより、「Hello, YourName!」が返されるはずです。

HTTPリクエストとレスポンスの理解

Cloud FunctionがHTTPリクエストによってトリガーされると、リクエストに関する情報を含むオブジェクトを受け取ります。このオブジェクトには通常、以下が含まれます。

次に、関数はHTTPレスポンスを返す必要があり、これには以下が含まれます。

例:さまざまなHTTPメソッドの処理

Cloud FunctionでさまざまなHTTPメソッドを処理する方法の例を次に示します。

Python (main.py):

from flask import escape

def http_method(request):
    """Responds to any HTTP request.
    Args:
        request (flask.Request): HTTP request object.
    Returns:
        The response text or any set of values that can be turned into a
        Response object using
        `make_response`.
    """
    if request.method == 'GET':
        return 'This is a GET request!'
    elif request.method == 'POST':
        request_json = request.get_json(silent=True)
        if request_json and 'message' in request_json:
            message = escape(request_json['message'])
            return f'This is a POST request with message: {message}'
        else:
            return 'This is a POST request without a message.'
    else:
        return 'Unsupported HTTP method.', 405

Node.js (index.js):

exports.httpMethod = (req, res) => {
  switch (req.method) {
    case 'GET':
      res.status(200).send('This is a GET request!');
      break;
    case 'POST':
      if (req.body.message) {
        const message = req.body.message;
        res.status(200).send(`This is a POST request with message: ${message}`);
      } else {
        res.status(200).send('This is a POST request without a message.');
      }
      break;
    default:
      res.status(405).send('Unsupported HTTP method!');
      break;
  }
};

更新された関数を`gcloud functions deploy`コマンドを使用してデプロイすることを忘れないでください。

HTTPトリガーの保護

HTTPトリガーを扱う場合、特に機密データや重要な操作を扱う場合は、セキュリティが最も重要です。以下は、いくつかの重要なセキュリティに関する考慮事項です。

認証と認可

デフォルトでは、HTTPによってトリガーされるCloud Functionsは、`--allow-unauthenticated`を使用するとパブリックにアクセスできます。ほとんどの本番環境では、承認されたユーザーまたはサービスへのアクセスを制限する必要があります。 Google Cloudには、認証と認可のためのいくつかのオプションが用意されています。

入力検証

SQLインジェクションやクロスサイトスクリプティング(XSS)などのセキュリティ脆弱性を防ぐために、Cloud Functionで受信した入力データを常に検証してください。悪意のある入力から保護するために、適切なサニタイズとエスケープのテクニックを使用してください。

HTTPS

クライアントと関数の間の通信を暗号化するために、Cloud FunctionがHTTPS経由でのみアクセスできることを確認してください。 Google Cloud Functionsは、HTTPSエンドポイントを自動的に提供します。

レート制限

悪用やサービス拒否(DoS)攻撃を防ぐために、レート制限を実装します。 Google Cloud Armorなどのサービスを使用して、Cloud Functionsを過剰なトラフィックから保護できます。

HTTPトリガーの使用例

HTTPトリガーは多用途であり、幅広いアプリケーションで使用できます。一般的な使用例を次に示します。

さまざまな業界の例

高度なテクニック

環境変数の使用

環境変数を使用すると、コードに機密情報や構成値をハードコーディングすることなく、Cloud Functionを構成できます。 `gcloud functions deploy`コマンドまたはGoogle Cloudコンソールを使用して、環境変数を設定できます。

gcloud functions deploy YOUR_FUNCTION_NAME \
    --runtime python39 \
    --trigger-http \
    --set-env-vars API_KEY=YOUR_API_KEY,DATABASE_URL=YOUR_DATABASE_URL

コードでは、`os.environ`ディクショナリ(Python)または`process.env`オブジェクト(Node.js)を使用して環境変数にアクセスできます。

Python:

import os

def your_function(request):
    api_key = os.environ.get('API_KEY')
    # Use the API key in your function
    return f'API Key: {api_key}'

Node.js:

exports.yourFunction = (req, res) => {
  const apiKey = process.env.API_KEY;
  // Use the API key in your function
  res.status(200).send(`API Key: ${apiKey}`);
};

非同期タスクの処理

実行時間の長いタスクや計算量の多いタスクの場合は、HTTPリクエストをブロックしないように、非同期処理を使用するのが最適です。 Google Cloud TasksやCloud Pub/Subなどのサービスを使用して、これらのタスクを個別のキューにオフロードできます。

エラー処理とロギング

問題をすばやく特定して解決するために、Cloud Functionsに堅牢なエラー処理とロギングを実装します。 Google Cloud Loggingを使用して、関数からログを収集し、そのパフォーマンスを監視します。

ベストプラクティス

一般的な問題のトラブルシューティング

結論

HTTPトリガーを使用したGoogle Cloud Functionsは、サーバーレスアプリケーションを構築するための強力で柔軟な方法を提供します。このガイドで説明されている概念とテクニックを理解することにより、Cloud Functionsの力を活用して、グローバルなオーディエンス向けの、スケーラブルで費用対効果が高く、イベント駆動型のソリューションを作成できます。サーバーレス革命を受け入れ、クラウドアプリケーションの可能性を最大限に引き出してください!